<?php
namespace Org\Util;
use Think\Upload;

/**
 * 上传工具类
 * @modify trainyao 2015-09-27 创建
 */
class UploadUtil{

    /**
     * 上传工具默认配置
     * @var array
     * @access private
     */
    private $defaultConfig = array(
        'maxSize' => 3145728,
        'rootPath' => './Uploads/',
        'savePath' => 'tmp/',
        'saveName' => array('uniqid',''),
        'exts' => array('jpg', 'gif', 'png', 'jpeg'),
        'autoSub' => false,
        'subName' => array('date','Ymd')
    );
    /**
     * 上传工作对象
     * @var stdClass
     * @access private
     */
    private $uploadObject = NULL;

    /**
     * 构造函数
     * 创建一个上传工作对象
     * @modify trainyao 2015-09-27 创建
     * @param array config 上传工作对象配置信息
     * @param string $driver 上传驱动标识
     * @param array $driverConfig 上传驱动配置信息
     */
    public function __construct($config = NULL, $driver, $driverConfig) {
        if(empty($config)) {
            $config = $this->defaultConfig;
        }
        $this->uploadObject = new Upload($config, $driver, $driverConfig);
    }

    /**
     * 更新配置信息
     * @modify trainyao 2015-09-27 创建
     * @param array $config 上传类配置信息
     * @param string $driver 上传驱动标识
     * @param array $driverConfig 上传驱动配置信息
     * @return boolean 更新结果
     */
    public function setConfig($config = array(), $driver = '', $driverConfig = NULL) {
        if(is_null($this->uploadObject)) {
            return false;
        }

        $this->uploadObject->updateConfig($config, $driver, $driverConfig);
        return true;
    }

    /**
     * 更新上传文件Uploads下的子目录
     * @modify trainyao 2015-09-27 创建
     * @param string $savePath 文件保存路径
     * @return boolean 更新路径结果
     */
    public function setSavePath($savePath = NULL) {
        if(empty($this->uploadObject)) {
            return false;
        }

        if(empty($savePath)) {
            $savePath = $this->defaultConfig['savePath'];
        }

        // 检查路径尾是否带有斜杠
        if(substr($savePath, -1) !== '/') {
            $savePath = $savePath . '/';
        }

        $this->uploadObject->savePath = $savePath;
        return true;
    }

    /**
     * 更新上传文件名字/规则
     * @modify trainyao 2015-09-27 创建
     * @param mixed $saveName 文件名字:string/文件名字规则:array('规则函数名', ['规则函数参数(s)', ...] )
     * @return boolean 更新结果
     */
    public function setSaveName($saveName = NULL) {
        if(empty($this->uploadObject)) {
            return false;
        }

        if(empty($saveName)) {
            $saveName = $this->defaultConfig['saveName'];
        }

        $this->uploadObject->saveName = $saveName;
        return true;
    }

    /**
     * 更新上传根目录
     * @modify trainyao 2015-09-27 创建
     * @param string $rootPath 根目录
     * @return boolean 更新结果
     */
    public function setRootPath($rootPath = NULL) {
        if(empty($this->uploadObject)) {
            return false;
        }

        if(empty($rootPath)) {
            $rootPath = $this->defaultConfig['rootPath'];
        }

        // 检查路径尾是否带有斜杠
        if(substr($rootPath, -1) !== '/') {
            $rootPath = $rootPath . '/';
        }

        $this->uploadObject->rootPath = $rootPath;
        return true;
    }

    /**
     * 更新上传文件格式限制
     * @modify trainyao 2015-09-27 创建
     * @param mixed $exts 文件格式限制
     * @return boolean 更新结果
     */
    public function setExts($exts = NULL) {
        if(empty($this->uploadObject) || (!is_array($exts) && !is_string($exts))) {
            return false;
        }

        if(empty($exts)) {
            $exts = $this->defaultConfig['exts'];
        }

        $this->uploadObject->updateExts($exts);
        return true;
    }

    /**
     * 执行上传
     * @modify trainyao 2015-09-27 创建
     * @return mixed 上传结果 成功返回文件信息数组,失败返回失败信息(string)
     */
    public function upload() {
        if(empty($this->uploadObject)) {
            return false;
        }

        $infos = $this->uploadObject->upload();
        if(!$infos){
            return $this->uploadObject->getError();
        }

        // 生成成功上传文件路径
        foreach($infos as $index => $fileInfo) {
            $savePath = $fileInfo['savepath'] . $fileInfo['savename'];
            $infos[$index]['filePath'] = '/Uploads/'. $savePath;
        }
        return $infos;
    }
}